#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#include "FastLED.h"  // 此示例程序需要使用FastLED库
#define NUM_LEDS 255 // LED灯珠数量
#define DZ1 4		  // Arduino输出控制信号引脚 长点阵控制引脚
#define DZ2 32
#define DZ3 26
#define DZ4 19
#define DZ5 25
#define DZ6 12
#define DZ7 14
#define DZ8 27 // 上灯带控制引脚（四边形）
#define DZ9 13
#define DZ 23 //板子上面自带的灯珠
// #define DZ1 25              // Arduino输出控制信号引脚
#define LED_TYPE WS2812B // LED灯带型号
#define COLOR_ORDER GRB	 // RGB灯珠中红色、绿色、蓝色LED的排列顺序

uint8_t max_bright = 255; // LED亮度控制变量，可使用数值为 0 ～ 255， 数值越大则光带亮度越高
CRGB leds_DZ1[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ2[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ3[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ4[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ5[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ6[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ7[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ8[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ9[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ[NUM_LEDS];  // 建立点阵leds
// 初始化函数
void setup()
{
	LEDS.addLeds<LED_TYPE, DZ1, COLOR_ORDER>(leds_DZ1, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ2, COLOR_ORDER>(leds_DZ2, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ3, COLOR_ORDER>(leds_DZ3, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ4, COLOR_ORDER>(leds_DZ4, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ5, COLOR_ORDER>(leds_DZ5, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ6, COLOR_ORDER>(leds_DZ6, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ7, COLOR_ORDER>(leds_DZ7, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ8, COLOR_ORDER>(leds_DZ8, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ9, COLOR_ORDER>(leds_DZ9, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ, COLOR_ORDER>(leds_DZ, NUM_LEDS); // 初始化点阵
	FastLED.setBrightness(max_bright);							  // 设置灯带亮度
}
// 点亮所有灯珠
void light_all(int color)
{
	// fill_sold section全部点亮/熄灭，没有时间差 CRGB::Blue
	fill_solid(leds_DZ1, NUM_LEDS, color);
	fill_solid(leds_DZ2, NUM_LEDS, color);
	fill_solid(leds_DZ3, NUM_LEDS, color);
	fill_solid(leds_DZ4, NUM_LEDS, color);
	fill_solid(leds_DZ5, NUM_LEDS, color);
	fill_solid(leds_DZ6, NUM_LEDS, color);
	fill_solid(leds_DZ7, NUM_LEDS, color);
	fill_solid(leds_DZ8, NUM_LEDS, color);
	fill_solid(leds_DZ9, NUM_LEDS, color);
	fill_solid(leds_DZ, NUM_LEDS, color);
	FastLED.show();
}

void off_all()
{
	// fill_sold section全部点亮/熄灭，没有时间差 CRGB::Blue
	fill_solid(leds_DZ1, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ2, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ3, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ4, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ5, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ6, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ7, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ8, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ9, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ, NUM_LEDS, CRGB::Black);
	FastLED.show();
}

// 通过for循环来点亮所有的WS2812B
void light_all_via_for()
{
	for (int i = 0; i < NUM_LEDS; i++)
	{
		leds_DZ1[i] = CRGB::Blue; // 设置灯带中第一个灯珠颜色为红色，leds[0]为第一个灯珠，leds[1]为第二个灯珠
	}
	FastLED.show(); // 更新LED色彩
	delay(500);
	for (int i = 0; i < NUM_LEDS; i++)
	{
		leds_DZ1[i] = CRGB::Black; // 设置灯带中第一个灯珠颜色为红色，leds[0]为第一个灯珠，leds[1]为第二个灯珠
	}
	FastLED.show(); // 更新LED色彩
	delay(500);		// 等待500毫秒
}

//跑马灯程序
void run_horse_led(int delay_time)
{
	int delay_t = delay_time;
	for (int i = 0; i < NUM_LEDS - 5; i++)
	{
		fill_solid(leds_DZ1 + i, 5, CRGB::Blue);
		FastLED.show();
		delay(delay_t);

		fill_solid(leds_DZ1 + i, 5, CRGB::Black);
		FastLED.show();
		delay(delay_t);
	}

	for (int i = NUM_LEDS - 5; i > 0; i--)
	{
		fill_solid(leds_DZ1 + i, 5, CRGB::Blue);
		FastLED.show();
		delay(delay_t);

		fill_solid(leds_DZ1 + i, 5, CRGB::Black);
		FastLED.show();
		delay(delay_t);
	}
}

CHSV my_hsv_color(0, 255, 255);
// 通过HSV色彩空间进行颜色的改变
void hsv_color_change()
{
	fill_solid(leds_DZ1, NUM_LEDS, my_hsv_color);
	FastLED.show();
	my_hsv_color.h++;
	// my_hsv_color.v++;
	delay(1);
}
//跑马灯程序+HSV色彩空间颜色变化程序
void hsv_horse_color_change(int delay_time)
{
	//跑马灯程序
	int delay_t = delay_time;
	for (int i = 0; i < NUM_LEDS - 5; i++)
	{
		fill_solid(leds_DZ1 + i, 5, my_hsv_color);
		my_hsv_color.h++;
		FastLED.show();
		delay(delay_t);

		fill_solid(leds_DZ1 + i, 5, CRGB::Black);
		FastLED.show();
		delay(delay_t);
	}

	for (int i = NUM_LEDS - 5; i > 0; i--)
	{
		fill_solid(leds_DZ1 + i, 5, my_hsv_color);
		my_hsv_color.h++;
		FastLED.show();
		delay(delay_t);

		fill_solid(leds_DZ1 + i, 5, CRGB::Black);
		FastLED.show();
		delay(delay_t);
	}
}

//彩虹色渐变固定不变
void rain_bow_solid()
{
	fill_rainbow(leds_DZ1, NUM_LEDS, 0);
	FastLED.show();
}
uint8_t the_color = 0;
uint8_t change_step = 3;

//彩虹色渐变流动
void rain_bow_fluid()
{
	fill_rainbow(leds_DZ1, NUM_LEDS, the_color, change_step);
	FastLED.show();
	the_color++; // 为什么这个一直加不会超过有效的最大数值，因为这个变量的类
				 // 型是uint8_t，最大只会保存到255，所以不会超过255的
				 // change_step+=0.1;  // 这一句没啥用
}

//光滑过渡显示两种颜色，并且可以决定起始灯珠位置和终止灯珠位置
void gradient_clor()
{
	fill_gradient(leds_DZ1, 0, CHSV(50, 255, 255), NUM_LEDS, CHSV(150, 255, 255), LONGEST_HUES);
	FastLED.show();
}

uint8_t startIndex = 0;
//色板函数
void palette_color()
{
	startIndex++;
	// lED光带对象 灯珠数量 起始颜色序号 灯珠间色差 色板名称 亮度 颜色过渡效果(NOBLEND)
	fill_palette(leds_DZ1, NUM_LEDS, startIndex, 8, LavaColors_p, 255, LINEARBLEND);
	FastLED.show();
}

void loop()
{
	int delay_time = 10;
	light_all(CRGB::Yellow);
	delay(delay_time);
	off_all();
	delay(2000 - delay_time);
	// palette_color();
	// fill_solid(leds_DZ1+511, 512, CRGB::Green);
	// FastLED.show();
	// gradient_clor();
	// rain_bow_fluid();
	// rain_bow_solid();
	// hsv_horse_color_change(1);
	// hsv_color_change();
	// run_horse_led(1);
}
